package com.xixi.dataStructure.queue;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * /**
 * 请定义一个队列并实现函数 max_value 得到队列里的最大值，要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是
 * O(1)。
 * <p>
 * 若队列为空，pop_front 和 max_value 需要返回 -1
 * <p>
 * 示例 1：
 * <p>
 * 输入:
 * ["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
 * [[],[1],[2],[],[],[]]
 * 输出: [null,null,null,2,1,2]
 * <p>
 * <p>
 * 示例 2：
 * <p>
 * 输入:
 * ["MaxQueue","pop_front","max_value"]
 * [[],[],[]]
 * 输出: [null,-1,-1]
 * <p>
 * <p>
 * <p>
 * <p>
 * 限制：
 * <p>
 * <p>
 * 1 <= push_back,pop_front,max_value的总操作数 <= 10000
 * 1 <= value <= 10^5
 * <p>
 * <p>
 * Related Topics 设计 队列 单调队列 👍 422 👎 0
 */


public class ID_interview_59_II_DuiLieDeZuiDaZhiLcof {
    public static void main(String[] args) {
        MaxQueue solution = new ID_interview_59_II_DuiLieDeZuiDaZhiLcof().new MaxQueue();
    }


    //leetcode submit region begin(Prohibit modification and deletion)
    class MaxQueue {

        Queue<Integer> integerQueue = new LinkedList<>();
        Deque<Integer> nextMax = new LinkedList<>();

        public MaxQueue() {

        }

        public int max_value() {
            if (nextMax.isEmpty()) return -1;
            return nextMax.peek();

        }

        public void push_back(int value) {

            integerQueue.offer(value);
            while (!nextMax.isEmpty() && nextMax.peekLast() < value) {
                nextMax.pollLast();
            }
            nextMax.offer(value);


        }

        public int pop_front() {
            if (integerQueue.isEmpty()) return -1;
            int ans = integerQueue.poll();

            if (ans == nextMax.peek()) nextMax.pop();
            return ans;
        }


    }

/**
 * Your MaxQueue object will be instantiated and called as such:
 * MaxQueue obj = new MaxQueue();
 * int param_1 = obj.max_value();
 * obj.push_back(value);
 * int param_3 = obj.pop_front();
 */
//leetcode submit region end(Prohibit modification and deletion)


}